<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
	<meta name="keywords" content="nacos" />
	<meta name="description" content="使用Nacos实现Spring Cloud Zuul的动态路由" />
	<!-- 网页标签标题 -->
	<title>使用Nacos实现Spring Cloud Zuul的动态路由</title>
	<link rel="shortcut icon" href="https://img.alicdn.com/tfs/TB1hgJpHAPoK1RjSZKbXXX1IXXa-64-64.png"/>
	<link rel="stylesheet" href="/build/blogDetail.css" />
</head>
<body>
	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/zh-cn/index.html"><img class="logo" src="/img/nacos_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">En</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a href="/zh-cn/index.html">首页</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/docs/what-is-nacos.html">文档</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/zh-cn/blog/index.html">博客</a></li><li class="menu-item menu-item-normal"><a href="/zh-cn/community/index.html">社区</a></li><li class="menu-item menu-item-normal"><a href="https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0">企业版Nacos</a><img class="menu-img" src="https://img.alicdn.com/tfs/TB1esl_m.T1gK0jSZFrXXcNCXXa-200-200.png"/></li><li class="menu-item menu-item-normal"><a href="http://console.nacos.io/nacos/index.html">控制台样例</a></li></ul></div></div></header><section class="blog-content markdown-body"><h1>使用Nacos实现Spring Cloud Zuul的动态路由</h1>
<blockquote>
<p>authors: 叶志远</p>
</blockquote>
<h3>一.前言</h3>
<p>Nacos是阿里巴巴开源的致力于服务发现与管理、动态配置管理，以及动态DNS服务的中间件，目前已发布至0.5.0版本，除了与Spring Cloud更加紧密结合以外，还丧心病狂地支持JDK11。如果您目前的项目碍于Eureka的性能，而又缺乏成本引进Consul，那么Nacos是您最好的选择。好了，回到正题，在上周许进搞了一个<a href="http://xujin.org/sc/gw/gw10/">使用Nacos实现Spring Cloud Gateway的动态路由</a>，让我们直观地感受到了Nacos的无缝接入如丝般顺滑，作为Spring Cloud中网关的始祖Zuul，自然也需要这一贴心赋能。</p>
<h3>二.Spring Cloud Zuul动态路由实现思路</h3>
<p>在社区书籍《重新定义Spring Cloud实战》中第8章4小节，详细剖析了Zuul的路由配置表加载以及刷新原理，其大致思想就是重写SimpleRouteLocator类的locateRoutes()方法，同时实现RefreshableRouteLocator接口，方法体引用父类的doRefresh()方法。在书中使用DB作为配置存放的仓库，如今有更为强大的Nacos，只需要将之前读取DB的逻辑换成读取Nacos即可。美中不足的是，由于Nacos还需进一步完善，目前对Spring Cloud中的事件支持还不是很完美，动态刷新只能依靠Zuul的内部逻辑。</p>
<h3>三.具体实现</h3>
<h5>1.在zuul-server中添加Nacos的配置</h5>
<pre><code>	&lt;dependency&gt;
		&lt;groupId&gt;com.alibaba.nacos&lt;/groupId&gt;
		&lt;artifactId&gt;nacos-client&lt;/artifactId&gt;
		&lt;version&gt;0.4.0&lt;/version&gt;
	&lt;/dependency&gt;
</code></pre>
<h5>2.读取Nacos配置信息核心代码</h5>
<pre><code>@Component
public class PropertiesAssemble{

	public Map&lt;String, ZuulRoute&gt; getProperties() {
		Map&lt;String, ZuulRoute&gt; routes = new LinkedHashMap&lt;&gt;();
		List&lt;ZuulRouteEntity&gt; results = listenerNacos(&quot;zuul-server&quot;,&quot;zuul_route&quot;);
		for (ZuulRouteEntity result : results) {
			if (StringUtils.isBlank(result.getPath())
					/*|| org.apache.commons.lang3.StringUtils.isBlank(result.getUrl())*/) {
				continue;
			}
			ZuulRoute zuulRoute = new ZuulRoute();
			try {
				BeanUtils.copyProperties(result, zuulRoute);
			} catch (Exception e) {
			}
			routes.put(zuulRoute.getPath(), zuulRoute);
		}
		return routes;
	}

	private List&lt;ZuulRouteEntity&gt; listenerNacos (String dataId, String group) {
		try {
			Properties properties = new Properties();
			properties.put(PropertyKeyConst.SERVER_ADDR, &quot;localhost:8848&quot;);
			ConfigService configService = NacosFactory.createConfigService(properties);
			String content = configService.getConfig(dataId, group, 5000);
			System.out.println(&quot;从Nacos返回的配置：&quot; + content);
			//注册Nacos配置更新监听器，用于监听触发
//            configService.addListener(dataId, group, new Listener()  {
//                @Override
//                public void receiveConfigInfo(String configInfo) {
//                    System.out.println(&quot;Nacos更新了！&quot;);
//
//                }
//                @Override
//                public Executor getExecutor() {
//                    return null;
//                }
//            });
			return JSONObject.parseArray(content, ZuulRouteEntity.class);
		} catch (NacosException e) {
			e.printStackTrace();
		}
		return new ArrayList&lt;&gt;();
	}
}
</code></pre>
<p>目前的demo写得比较简单，直接将Nacos的默认地址与端口写了进来，Nacos对于配置的管理有两个坐标，一是dataId，二是group，本demo中笔者将其分别命名为&quot;zuul-server&quot;,&quot;zuul_route&quot;。</p>
<h5>3.Zuul动态刷新路由实现</h5>
<p>这部分可以查看demo地址：<a href="https://github.com/SpringCloud/spring-cloud-zuul-nacos">https://github.com/SpringCloud/spring-cloud-zuul-nacos</a>，具体就不赘述。</p>
<h3>四.演示</h3>
<h5>1.从Nacos github地址pull源码，配置环境</h5>
<p><img src="https://img-blog.csdnimg.cn/20181129002717633.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">
这里需要在IDEA中添加启动参数-Dnacos.standalone=true
<img src="https://img-blog.csdnimg.cn/20181129002856286.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h5>2.启动Nacos，配置Zuul路由信息</h5>
<p>启动Nacos后，在浏览器输入<a href="http://localhost:8848/nacos/index.html">http://localhost:8848/nacos/index.html</a>便会跳转到如下页面：
<img src="https://img-blog.csdnimg.cn/2018112900323177.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">
点击配置列表，单击右侧的+号图标，便可以新增一项配置，由于这里已经添加好了，就直接看信息：
<img src="https://img-blog.csdnimg.cn/20181129003545464.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h5>3.启动zuul-server，从Nacos加载路由信息测试</h5>
<p>启动Zuul后，console中出现如下信息：
<img src="https://img-blog.csdnimg.cn/20181129003851880.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">
在浏览器输入<a href="http://localhost:5555/baidu">http://localhost:5555/baidu</a>,出现如下效果，直接跳转到目标地址：
<img src="https://img-blog.csdnimg.cn/2018112900414387.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">
我们现在将Nacos中的配置修改一下，将http://github.com/Lovnx换成http://www.baidu.com，修改后直接发布：
<img src="https://img-blog.csdnimg.cn/20181129004408166.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">
我们会在console看到：
<img src="https://img-blog.csdnimg.cn/20181129004524375.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述">
在浏览器输入<a href="http://localhost:5555/baidu">http://localhost:5555/baidu</a>,出现如下效果：
<img src="https://img-blog.csdnimg.cn/20181129004810756.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3JpY2tpeWVhdA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p>
<h2><a href="https://github.com/SpringCloud/spring-cloud-zuul-nacos">-------------------&gt;&gt;&gt;DEMO源码</a></h2>
</section><footer class="footer-container"><div class="footer-body"><img src="/img/nacos_gray.png"/><div class="cols-container"><div class="col col-12"><h3>愿景</h3><p>Nacos 通过提供简单易用的动态服务发现、服务配置、服务共享与管理等服务基础设施，帮助用户在云原生时代，在私有云、混合云或者公有云等所有云环境中，更好的构建、交付、管理自己的微服务平台，更快的复用和组合业务服务，更快的交付商业创新的价值，从而为用户赢得市场。</p></div><div class="col col-6"><dl><dt>文档</dt><dd><a href="/zh-cn/docs/what-is-nacos.html" target="_self">概览</a></dd><dd><a href="/zh-cn/docs/quick-start.html" target="_self">快速开始</a></dd><dd><a href="/zh-cn/docs/contributing.html" target="_self">开发者指南</a></dd></dl></div><div class="col col-6"><dl><dt>资源</dt><dd><a href="/zh-cn/community/index.html" target="_self">社区</a></dd><dd><a href="https://www.aliyun.com/product/acm?source_type=nacos_pc_20181219" target="_self">云服务 ACM</a></dd><dd><a href="https://www.aliyun.com/product/edas?source_type=nacos_pc_20181219" target="_self">云服务 EDAS</a></dd><dd><a href="https://www.aliyun.com/product/ahas?source_type=nacos_pc_20190225" target="_self">云服务 AHAS</a></dd></dl></div></div><div class="copyright"><span>@ 2018 The Nacos Authors | An Alibaba Middleware (Aliware) Project</span></div></div></footer></div></div>
	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
	<script>
		window.rootPath = '';
  </script>
	<script src="/build/blogDetail.js"></script>
</body>
</html>